package co.com.inversiones.xyz.ltda.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.com.inversiones.xyz.ltda.dao.SolicitudDao;
import co.com.inversiones.xyz.ltda.dto.Rol;
import co.com.inversiones.xyz.ltda.dto.Solicitud;
import co.com.inversiones.xyz.ltda.exception.DaoException;

public class SolicitudDaoImpl extends HibernateDaoSupport implements
		SolicitudDao {

	@Override
	public List<Solicitud> leerSolicitudesGood(String estado)
			throws DaoException {
		List<Solicitud> solicitudes = new ArrayList<>();

		Session sesion = null;
		try {
			sesion = getSession();

			solicitudes = sesion.createCriteria(Solicitud.class).add(Restrictions.eq("estado", estado)).list();
		} catch (HibernateException e) {
			throw new DaoException(
					"Error consultado las solicitudes por estado", e);
		}

		return solicitudes;

	}

	/**
	 * Este metodo consulta las solicitudes que esten en el sistema y que se
	 * encuentren en un estado especifico. A diferencia del primero consulta
	 * todas las solicitudes y las separa en java
	 * 
	 * @param rol
	 *            Clase que contiene el rol del usuario, y permite identificar
	 *            que solicitudes traer
	 * @param op
	 *            Es un entero que permite hacer una cosa o la otra.
	 * @return La lista de solisitudes.
	 * @throws DaoException
	 */

	@Override
	public List<Solicitud> leerSolicitudes(Rol rol, int op) throws DaoException {
		List<Solicitud> solicitud = new ArrayList<>();
		List<Solicitud> solicitudAux = new ArrayList<>();
		Session sesion = null;
		try {
			sesion = getSession();

			solicitud = sesion.createCriteria(Solicitud.class).list();
		} catch (HibernateException e) {
			throw new DaoException("Error consultado todas las solicitudes", e);
		}
		if (rol.getNombre().equals("gerente")) {
			if (op == 0) {
				for (int i = 0; i < solicitud.size(); i++) {
					if (solicitud.get(i).getEstado().equals("enviado")) {
						solicitudAux.add(solicitud.get(i));
					}
				}
				return solicitudAux;
			}
			if (op == 1) {
				for (int i = 0; i < solicitud.size(); i++) {
					if (solicitud.get(i).getEstado().equals("noResuelta")) {
						solicitudAux.add(solicitud.get(i));
					}
				}
				return solicitudAux;
			}
			return solicitud;
		}
		if (rol.getNombre().equals("soporteBancario")) {
			for (int i = 0; i < solicitud.size(); i++) {
				if (solicitud.get(i).getEstado().equals("soporteBancario")) {
					solicitudAux.add(solicitud.get(i));
				}
			}
			return solicitudAux;
		}
		if (rol.getNombre().equals("soporteTecnico")) {
			for (int i = 0; i < solicitud.size(); i++) {

				if (solicitud.get(i).getEstado().equals("soporteTecnico")) {

					solicitudAux.add(solicitud.get(i));
				}
			}
		}
		if (rol.getNombre().equals("soporteVentas")) {
			for (int i = 0; i < solicitud.size(); i++) {
				if (solicitud.get(i).getEstado().equals("soporteVentas")) {
					solicitudAux.add(solicitud.get(i));
				}
			}
			return solicitudAux;
		}

		return null;
	}

	/**
	 * Este metodo consulta una solicitud por su codigo.
	 * 
	 * @param codigo
	 *            Codigo de la solicitud.
	 * @return Solicitud por codigo
	 * @throws DaoException
	 */

	@Override
	public Solicitud buscarSolicitud(int codigo) throws DaoException {
		Solicitud solicitud = new Solicitud();

		Session sesion = null;
		try {
			sesion = getSession();

			solicitud = (Solicitud) sesion.createCriteria(Solicitud.class)
					.add(Restrictions.eq("idSolicitud", codigo)).uniqueResult();
		} catch (HibernateException e) {
			throw new DaoException("Error consultado la solicitud de codigo: "
					+ codigo, e);
		}

		return solicitud;
	}

	/**
	 * El metodo actualiza una solicitud en especifico.
	 * 
	 * @param solicitud
	 *            a actualizar
	 * @throws DaoException
	 */
	@Override
	public void guardarSolicitud(Solicitud solicitud) throws DaoException {

		Session sesion = null;
		try {
			sesion = getSession();

			sesion.save(solicitud);

		} catch (HibernateException e) {

			throw new DaoException("Error Guardando la solicitud de codigo: "
					+ solicitud.getIdSolicitud(), e);

		}
	}

	/**
	 * El metodo actualiza una solicitud en especifico.
	 * 
	 * @param solicitud
	 *            a actualizar
	 * @return solicitud si la operacion fue exitosa.
	 * @throws DaoException
	 */
	@Override
	public void modificarSolicitud(Solicitud solicitud) throws DaoException {

		Session sesion = null;
		try {
			sesion = getSession();

			sesion.update(solicitud);

		} catch (HibernateException e) {

			throw new DaoException("Error Modificando la solicitud de codigo: "
					+ solicitud.getIdSolicitud(), e);

		}
	}

}
